// BusquedaView.cpp : implementation file
//

#include "stdafx.h"
#include "isismarc.h"
#include "BusquedaView.h"
#include "IsisDocSearch.h"
#include "Diccionario.h"
#include "Expobusqueda.h"
     
//#include "global.h"
#include "mensaje.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CBusquedaView

IMPLEMENT_DYNCREATE(CBusquedaView, CFormView)

CBusquedaView::CBusquedaView()
	: CFormView(CBusquedaView::IDD)
{
	
	//{{AFX_DATA_INIT(CBusquedaView)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	primera = true;	
	DictAbierto = false;
	m_RecsLastSearch = 0;
		
//	g_ListaBusquedas = CArray();
}

CBusquedaView::~CBusquedaView()
{
}

void CBusquedaView::DoDataExchange(CDataExchange* pDX)
{
	
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CBusquedaView)
	DDX_Control(pDX, IDC_botonexpresion, m_expbusqueda);
	DDX_Control(pDX, IDC_DOWNPAGE, m_BotonAnterior);
	DDX_Control(pDX, IDC_UPPAGE, m_BotonSiguiente);
		DDX_Control(pDX, IDC_EXPRESION, m_ExpresionBusqueda);
		DDX_Control(pDX, IDC_LISTABUSQUEDAS, m_HistoricoBusquedas);
		DDX_Control(pDX, IDC_COMBOTAGS, m_ComboTags);
		DDX_Control(pDX, IDC_OK, m_Execute);
		DDX_Control(pDX, IDC_CLEAR, m_Clear);
		DDX_Control(pDX, IDC_CANCEL, m_Cancel);
		DDX_Control(pDX, IDC_STATIC1, m_LabelExpresion);
		DDX_Control(pDX, IDC_STATIC2, m_LabelHistorico);
		DDX_Control(pDX, IDC_STATIC3, m_LabelChoice);
		DDX_Control(pDX, IDC_STATIC4, m_LabelHelp);
		DDX_Control(pDX, IDC_NUMRESULTS, m_NumResults);
		DDX_Control(pDX, IDC_VIEWDICT, m_VerDiccionario);
		DDX_Control(pDX, IDC_MSFLEXGRID1, m_Grid_Resultados);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CBusquedaView, CFormView)
	//{{AFX_MSG_MAP(CBusquedaView)
	ON_WM_SETFOCUS()
	ON_WM_CANCELMODE()
	ON_BN_CLICKED(IDC_OK, OnOk)
	ON_BN_CLICKED(IDC_CLEAR, OnClear)
	ON_CBN_SELCHANGE(IDC_COMBOTAGS, OnSelchangeCombotags)
	ON_BN_CLICKED(IDC_BUTTON1, OnButtonAnd)
	ON_BN_CLICKED(IDC_BUTTON2, OnButtonOr)
	ON_BN_CLICKED(IDC_BUTTON3, OnButtonNot)
	ON_LBN_SELCHANGE(IDC_LISTABUSQUEDAS, OnSelchangeListabusquedas)
	ON_BN_CLICKED(IDC_BUTTON4, OnParentesisAbre)
	ON_BN_CLICKED(IDC_BUTTON5, OnParentesisCierra)
	ON_BN_CLICKED(IDC_VIEWDICT, OnViewdict)
	ON_WM_CHAR()
	ON_BN_CLICKED(IDC_UPPAGE, OnBotonAnterior)
	ON_BN_CLICKED(IDC_DOWNPAGE, OnBotonSiguiente)
	ON_WM_CAPTURECHANGED()
	ON_BN_CLICKED(IDC_CANCEL, OnCancel)
	ON_BN_CLICKED(IDC_botonexpresion, Onbotonexpresion)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBusquedaView diagnostics

#ifdef _DEBUG
void CBusquedaView::AssertValid() const
{
	CFormView::AssertValid();
}

void CBusquedaView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CBusquedaView message handlers

void CBusquedaView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView) 
{
	// TODO: Add your specialized code here and/or call the base class
  CFormView::OnActivateView(bActivate, pActivateView, pDeactiveView);
  CargarMenu(cip_menu+"mn"+cip_lang+cip_perfil+".mst");
 // Generar_Grid_Resultados();
  
  
}


void CBusquedaView::CalcWindowRect(LPRECT lpClientRect, UINT  nAdjustType) 
{
	// TODO: Add your specialized code here and/or call the base class
	//AfxMessageBox(cip_menu+"mn"+cip_lang+cip_perfil+".mst");

  
    CFormView::CalcWindowRect(lpClientRect, nAdjustType);
	
}


BOOLEAN CBusquedaView::OnFileClose()
{
	cmi.IsisFin();
	return true;
}


void CBusquedaView::OnSetFocus(CWnd* pOldWnd) 
{
	 CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;

	
	// Aca me fijo si la ventana que tengo
	// ahora asociada es igual a la del Frame
	// si lo es no la cambio, si no es igual reinicio
	// el MyIsis

	 

	if (vista_asociada!=pFrame->view || primera)
	{
				
		vista_asociada = pFrame->view;

		// Seteo las variables de presentacion de 
		// la lista de resultados

		this->m_Origen=1;
		this->m_LongLista=10;
		
			
		if (!primera)
		{
			if (DictAbierto)
			{
				MyDict->Cerrar();
			}
			cmi.IsisFin();
		}
		else
		{
			Asignar_Traducciones();					

		}

		m_Grid_Resultados.SetRows(1);
		m_Grid_Resultados.Clear();
		//m_Grid_Resultados.Refresh();
		int i=cmi.IsisIniciarRegistro(vista_asociada->datos);		
		Asignar_Lista_Tags();
		primera = false;		

	}

    
  	CFormView::OnSetFocus(pOldWnd);

	// Solo si no hay resultados le doy el foco
	// a la expresion, cc o tiene el Grid

	if (m_Grid_Resultados.GetRows()==1)
		m_ExpresionBusqueda.SetFocus();

	CIsisDocSearch* pDoc = (CIsisDocSearch*) GetDocument();
	pDoc->SetearTitulo (vista_asociada->base_activa+" - "+tMensaje[40][0]);
	Actualizar_Lista_Busquedas();

}

void CBusquedaView::OnCancelMode() 
{
	CFormView::OnCancelMode();
	
	// TODO: Add your message handler code here
	
}



void CBusquedaView::OnOk() 
{
	// TODO: Add your control notification handler code here
	CString expresion;

	m_ExpresionBusqueda.GetWindowText(expresion);
	if (expresion.GetLength()>0)
	{

		
		m_ExpresionSaved = expresion;
		m_RecsLastSearch = cmi.IsisBuscarRegistro(Parser_Busquedas(expresion));
		Agregar_Historico_Busquedas(m_RecsLastSearch,expresion,Parser_Busquedas(expresion));

		if (m_RecsLastSearch<=0)
		{
			m_NumResults.SetWindowText(tMensaje[41][1]);
			m_RecsLastSearch = 0;
			
		}
		else
		{	
			m_expbusqueda.EnableWindow(true);
			this->m_Origen=1;
			Generar_Grid_Resultados();		
			CString cadena0 = "";
			cadena0.Format("%d",m_RecsLastSearch);
			m_NumResults.SetWindowText(tMensaje[41][4]+" "+cadena0+" "+tMensaje[41][5]);
		}
	}

}


void CBusquedaView::OnCancel() 
{
	// TODO: Add your control notification handler code here
//	cmi.IsisFin();
//	CView::OnCancel();	
	CIsisDocSearch * miDoc = (CIsisDocSearch *) this->GetDocument();
	miDoc->OnCloseDocument();

}


BEGIN_EVENTSINK_MAP(CBusquedaView, CFormView)
    //{{AFX_EVENTSINK_MAP(CBusquedaView)
	ON_EVENT(CBusquedaView, IDC_MSFLEXGRID1, -601 /* DblClick */, OnDblClickMsflexgrid1, VTS_NONE)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CBusquedaView::OnDblClickMsflexgrid1() 
{
	// TODO: Add your control notification handler code here
	
	CString seleccionado=m_Grid_Resultados.GetText();
	if (atoi(seleccionado)>0)
		vista_asociada->IrARegistro(atoi(seleccionado));
	//vista_asociada->SetFocus();

}

void CBusquedaView::Asignar_Traducciones()
{
	m_LabelExpresion.SetWindowText(tMensaje[40][1]);
	m_Clear.SetWindowText(tMensaje[40][2]);
	m_Cancel.SetWindowText(tMensaje[40][3]);
	m_Execute.SetWindowText(tMensaje[40][5]);
	m_LabelHistorico.SetWindowText(tMensaje[40][6]);
	m_LabelChoice.SetWindowText (tMensaje[41][2]);
	m_LabelHelp.SetWindowText (tMensaje[41][3]);
    m_expbusqueda.SetWindowText(tMensaje[53][0]);
   
	m_VerDiccionario.SetWindowText(tMensaje[40][7]);
	Generar_Grid_Resultados();

	m_expbusqueda.EnableWindow(false);
	
}

void CBusquedaView::Agregar_Historico_Busquedas(int numeroResultados, CString expresion, CString parseada)
{
	CBusqueda busca;
	CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;

	busca.m_Base = vista_asociada->base_activa;
	busca.m_Expresion = expresion;
	busca.m_Expresion_Explained = parseada;
	busca.m_NumeroResultados = numeroResultados;
	busca.m_Ordinal = pFrame->CantidadBusquedas()+1;
	pFrame->PushOnBusquedas(busca);	
	Actualizar_Lista_Busquedas();

}


void CBusquedaView::Actualizar_Lista_Busquedas()
{
	CBusqueda busca;
	CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;

	m_HistoricoBusquedas.ResetContent();

	int posicion=m_HistoricoBusquedas.AddString("<->");
	m_HistoricoBusquedas.SetItemData(posicion,0);

	int limite = pFrame->CantidadBusquedas();

	if (limite>1000)
	{
		limite=1000;
	}

	pFrame->ResetBusquedas();
	for (int i=1;i<=limite;i++)
	{
		busca = pFrame->PopOnBusqueda();
		posicion = m_HistoricoBusquedas.AddString(busca.Devolver_Busqueda_Formateada());
		m_HistoricoBusquedas.SetItemData(posicion,busca.m_Ordinal);

	}

	m_HistoricoBusquedas.SetCurSel(0);
	
}

void CBusquedaView::OnClear() 
{
	// TODO: Add your control notification handler code here
	this->m_ExpresionBusqueda.SetWindowText("");	
}

void CBusquedaView::Asignar_Lista_Tags()
{
	// Esto tiene que entrar en la FDT21
	// que a diferencia de WinIsis es en si una BDD
	// y obtener la lista completa de descripciones
	char area[255];
	CString tag;
	CString descripcion;
	CString arch;

	this->m_ComboTags.ResetContent();

	// Obtengo el nombre de la FDT21 asignada
	arch= vista_asociada->cip_dbisis + "isismarc\\fdt21.mst";

	// Aca hay que chequear que la FDT21 exista

	cmiFDT21.IsisIniciarRegistro(arch);
	int cant_reg = cmiFDT21.IsisCantRegistros();

	for (int i=1;i<=cant_reg;i++)
	{
		cmiFDT21.IsisRegistro(i,false);
		cmiFDT21.IsisCampo(1,i,1,area,sizeof(area));
		tag = area;

		cmiFDT21.IsisCampo(2,i,1,area,sizeof(area));
		descripcion = area;

		//AfxMessageBox (tag+" - "+descripcion);
		
		m_ComboTags.AddString(tag+" - "+descripcion);
	}

	cmiFDT21.IsisFin();
	m_ComboTags.SetCurSel(0);


}

void CBusquedaView::OnSelchangeCombotags() 
{
	// TODO: Add your control notification handler code here
	if (m_RecsLastSearch>0)
	{
		CString expresion;
		m_ExpresionBusqueda.GetWindowText(expresion);
		cmi.IsisBuscarRegistro(Parser_Busquedas(expresion));
    }
	Generar_Grid_Resultados();
}

void CBusquedaView::Generar_Grid_Resultados()
{
	long MfnActual;
	CString MfnString;

	

	m_Grid_Resultados.Clear();
	m_Grid_Resultados.Refresh();

	m_Grid_Resultados.SetCols(2);
	m_Grid_Resultados.SetTextArray(0,tMensaje[40][9]);
	m_Grid_Resultados.SetTextArray(1,tMensaje[40][10]);
	
	m_Grid_Resultados.SetColWidth(0, 700);
	m_Grid_Resultados.SetColWidth(1, 4500);
	
	
	if (m_RecsLastSearch>0)
	{
		m_Grid_Resultados.SetRows(m_LongLista+1);
	}
	else
	{
		m_Grid_Resultados.SetRows(1);
	}


	int fila=1;
	for (int i=this->m_Origen;(i<=m_RecsLastSearch && i<m_Origen+m_LongLista);i++)
	{
			MfnActual = cmi.IsisDevolverMFNBusqueda(i);

			// Los dos valores validos son o ZERO
			// o bloquedo. De ultima pasan a la view
			int retorno =cmi.IsisRegistro(MfnActual,false);

			if (retorno==ZERO || retorno== ERR_RECLOCKED)
			{
				MfnString.Format("%d",MfnActual);
				m_Grid_Resultados.SetCol(0);
				m_Grid_Resultados.SetRow(fila);
				m_Grid_Resultados.SetText(MfnString);
				m_Grid_Resultados.SetCol(1);
				m_Grid_Resultados.SetText(Obtener_Campo(i));
				m_Grid_Resultados.SetCellAlignment(1);
				fila++;
			}
	}
}

CString CBusquedaView::Obtener_Campo(int registro)
{
	CString seleccion;
	CString campo;
	char area[255];

	m_ComboTags.GetLBText(m_ComboTags.GetCurSel(),seleccion);

	// Me quedo con los tres caracteres del Tag

	cmi.IsisCampo(atoi(seleccion.Left(3)),registro,1,area,sizeof(area));
	campo = area;
	return Elimino_SubCampos(campo);
}


CString CBusquedaView::Elimino_SubCampos(CString campo)
{
	CString devuelve="";
	BOOLEAN estado=false;
		
	for (int i=0;i<campo.GetLength();i++)
	{
		if (campo[i]=='^')
		{
			estado=true;
		}
		else
		{
			if (estado)
			{
				devuelve+=";";
				estado=false;
			}
			else
			{
				devuelve+=campo[i];
			}
		}
	}
	return devuelve;

}

void CBusquedaView::OnButtonAnd() 
{
	// TODO: Add your control notification handler code here
	CString expresion;
	m_ExpresionBusqueda.GetWindowText(expresion);
	expresion+=" * ";
	m_ExpresionBusqueda.SetWindowText(expresion);

}

void CBusquedaView::OnButtonOr() 
{
	// TODO: Add your control notification handler code here
	CString expresion;
	m_ExpresionBusqueda.GetWindowText(expresion);
	expresion+=" + ";
	m_ExpresionBusqueda.SetWindowText(expresion);
}

void CBusquedaView::OnButtonNot() 
{
	// TODO: Add your control notification handler code here
	CString expresion;
	m_ExpresionBusqueda.GetWindowText(expresion);
	expresion+=" ^ ";
	m_ExpresionBusqueda.SetWindowText(expresion);
}


void CBusquedaView::OnSelchangeListabusquedas() 
{
	// TODO: Add your control notification handler code here
	if (m_HistoricoBusquedas.GetCurSel()>0)
	{
		CString expresion;
		CString seleccionada="";
		seleccionada.Format("%d",m_HistoricoBusquedas.GetItemData(m_HistoricoBusquedas.GetCurSel()));

		m_ExpresionBusqueda.GetWindowText(expresion);
		
		// recordar que hay que chequear que la BDD 
		// sea la misma que la asociada, sino poner la
		// expresion de busqueda
		
		if (expresion.GetLength()>0)
		{
			expresion+=" + ";
		}

		expresion+="( #"+seleccionada+" )";
		m_ExpresionBusqueda.SetWindowText(expresion);
	}
	
}

void CBusquedaView::OnParentesisAbre() 
{
	// TODO: Add your control notification handler code here
	CString expresion;
	m_ExpresionBusqueda.GetWindowText(expresion);
	expresion+=" ( ";
	m_ExpresionBusqueda.SetWindowText(expresion);
	
}

void CBusquedaView::OnParentesisCierra() 
{
	// TODO: Add your control notification handler code here
	CString expresion;
	m_ExpresionBusqueda.GetWindowText(expresion);
	expresion+=" ) ";
	m_ExpresionBusqueda.SetWindowText(expresion);
	
}

CString CBusquedaView::Parser_Busquedas(CString expresion)
{
	
	int inicio=0;
	int estado=0;
	CString parseada="";
	CString busqueda="";

	while (inicio<expresion.GetLength())
	{
		if (expresion[inicio]=='#')
		{
			estado=1;
		}
		else
		{
			if (Es_Separador(expresion[inicio]) && estado==1)
			{
				parseada += Obtener_ExpBusquedaAnt(atoi(busqueda))+expresion[inicio];
				//parseada += " -exp.busqueda -"+busqueda+expresion[inicio];
				busqueda="";
				estado=0;
			}
			else
			{
				if (estado==1)
				{
					busqueda+=expresion[inicio];
				}
				else
				{
					parseada+=expresion[inicio];
				}
			}
		}
		inicio++;
	}

	// Eventualmente puedo salir del while
	// con estado==1 con lo que tengo que reemplazar

	if (estado==1)
	{
		parseada += Obtener_ExpBusquedaAnt(atoi(busqueda));
		//parseada += " -exp.busqueda -"+busqueda+expresion[inicio];
		
	}

	return parseada;
}

BOOLEAN CBusquedaView::Es_Separador(char sep)
{
	if (sep=='*' || sep=='+'|| sep=='^' || sep==' ')
	{
		return true;
	}
	else
		return false;
}

CString CBusquedaView::Obtener_ExpBusquedaAnt(int Key)
{
	CBusqueda busca;
	CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
	
	pFrame->ResetBusquedas();

	int cantidad=0;
	int limite = pFrame->CantidadBusquedas();
	CString retorna = "";

	while (cantidad<limite)
	{
		busca=pFrame->PopOnBusqueda();
		if (busca.m_Ordinal==Key)
		{
			cantidad=limite;
			// 19-8 Devuelvo la busqueda parseada
			retorna=busca.m_Expresion_Explained;
		}
		cantidad++;
	}

	return retorna;
}



void CBusquedaView::OnViewdict() 
{
	// TODO: Add your control notification handler code here
	
	if (!DictAbierto)
	{
		MyDict = new CDiccionario (this);
		MyDict->Create(IDD_DIALOGDICCIO,GetParent());
	}

	MyDict->AsignarHandler(cmi);
	MyDict->ShowWindow(SW_RESTORE);
	MyDict->Titulo(this->vista_asociada->base_activa+" - "+tMensaje[41][6]);
	DictAbierto = true;
	
}

void CBusquedaView::CerrarDict()
{
	if (this->DictAbierto)
	{
		MyDict->Cerrar();
	}
	this->DictAbierto=false;
}

void CBusquedaView::AgregaTermDict(CString termino)
{
	CString expresion;
	m_ExpresionBusqueda.GetWindowText(expresion);
	if (expresion.GetLength()>0)
	{
		expresion+=" + "+termino;
	}
	else
	{
		expresion=termino;
	}
	m_ExpresionBusqueda.SetWindowText(expresion);
}



void CBusquedaView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	
	CFormView::OnChar(nChar, nRepCnt, nFlags);
}

void CBusquedaView::SetDiccionarioCerrado()
{
	// Lo usa el objeto diccionario para indicarle
	// que el usuario lo cerro por tanto
	// lo debe re-generar

	this->DictAbierto = false;
}

void CBusquedaView::OnBotonAnterior() 
{
	// TODO: Add your control notification handler code here

	if(m_RecsLastSearch>0)
	{
		m_Origen -= m_LongLista;
		if (m_Origen<=0)
			m_Origen=1;
		cmi.IsisBuscarRegistro(Parser_Busquedas(m_ExpresionSaved));
		this->Generar_Grid_Resultados();
	}

	
}

void CBusquedaView::OnBotonSiguiente() 
{
	// TODO: Add your control notification handler code here
	if(m_RecsLastSearch>0)
	{	
		// Me fijo si no es la ultima pagina
		if (m_Origen+m_LongLista+1<=m_RecsLastSearch)
		{
			m_Origen += m_LongLista;
			cmi.IsisBuscarRegistro(Parser_Busquedas(m_ExpresionSaved));
			this->Generar_Grid_Resultados();
		}
	}
}

void CBusquedaView::Onbotonexpresion() 
{
	// TODO: Add your control notification handler code here
	CString expresion;

	m_ExpresionBusqueda.GetWindowText(expresion);
	if (expresion.GetLength()>0)
	{
		 //mibase.IsisIniciarRegistro(vistaduenia->cip_dbisis+vistaduenia->base_activa);
	
  //CString pasaje;mibase.IsisIniciarRegistro(vistaduenia->vista_asociada->cip_dbisis+vistaduenia->vista_asociada->base_activa);
		//	pasaje= expresion;
	   
		CExpobusqueda cdial;
		cdial.SetExpresion(expresion);
		cdial.SetVistaDuenia(this->vista_asociada);
		
		cdial.DoModal();

	//	
         
	
	}

}
